/*
题目：https://leetcode.cn/problems/search-in-rotated-sorted-array/?envType=problem-list-v2&envId=array&
整数数组 nums 按升序排列，数组中的值 互不相同 。

在传递给函数之前，nums 在预先未知的某个下标 k（0 <= k < nums.length）上进行了 旋转，使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]（下标 从 0 开始 计数）。例如， [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ，如果 nums 中存在这个目标值 target ，则返回它的下标，否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
*/

#include<stdio.h>
int binarySearch (int arr[], int left,int right, int target){
     while (left <= right) {
        int mid = left + (right - left) / 2;  // 防止整数溢出
        
        if (arr[mid] == target) {
            return mid;  // 找到目标，返回索引
        } else if (arr[mid] < target) {
            left = mid + 1;  // 目标在右半部分
        } else {
            right = mid - 1;  // 目标在左半部分
        }
    }
    
    return -1;  // 未找到目标
}

int search(int* nums, int numsSize, int target) {
    int left = 0;
    int right = numsSize -1;
    int k = nums[0];
    int ans = -1;

    if(k==target){
        return 0;
    }

   if(nums[0]<nums[numsSize-1]){     //说明没螺旋   
    return binarySearch (nums,left,right,target);
   }

    while (left<=right){ 
        int mid = left+(right -left)/2;

        if(target==nums[mid]){ 
            return mid;
        }

        if(k<target){
            if((target<=nums[mid])){   // target 是在范围内的  k <= left < target < mid
                right = mid-1;
                return binarySearch(nums,left,right,target);
            }else if((k<=nums[mid]) && (nums[mid]<target)){  // target 是否在范围内未知      k<mid < targert
                left = mid+1;
            }else if(((nums[mid]<target) && (nums[mid]<=k))){ //
                right = mid-1;
            } 
        }else if(k>target){  //低部，左侧
            if((nums[mid]<target)){
                left = mid+1;
                return binarySearch(nums,left,right,target);
            }else if((nums[mid]>=k)){   //高部
                left = mid+1;
            }else if((nums[mid]<=k) && (nums[mid]>target)){  //低部，右侧
                right = mid-1;
            }
        }

    }

    return ans;
}

int main()
{ 
    int nums[] ={4,5,6,7,0,1,2};
    int size = sizeof(nums)/sizeof(int);
    int target = 0;
    int i = search(nums,size,target);

    
        printf("%d \n",i);
    
}